#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

typedef enum {
  Sound_Sine,
  Sound_Triangle,
  Sound_Sawtooth,
  Sound_Square,
  Sound_COUNT,
  // todo align w js
} Sound;

#include "parse_tune.h"

char *examples[] = {
  "166.66666666666666,\n"
  "166.66666666666666: a4^166.66666666666666,\n"
  "5000",

  "379.746835443038: d4^379.746835443038 + c5~379.746835443038,\n"
  "379.746835443038: b4~379.746835443038 + e4^379.746835443038 + g5/379.746835443038,\n"
  "379.746835443038: c5~379.746835443038,\n"
  "379.746835443038: d5~379.746835443038 + f4^379.746835443038 + b5/379.746835443038,\n"
  "379.746835443038: e5~379.746835443038 + g5/379.746835443038,\n"
  "379.746835443038: e4^379.746835443038 + a5/379.746835443038,\n"
  "379.746835443038: d5~379.746835443038,\n"
  "379.746835443038: c5~379.746835443038 + d4^379.746835443038 + g5/379.746835443038,\n"
  "379.746835443038: b4~379.746835443038,\n"
  "379.746835443038: b5/379.746835443038,\n"
  "379.746835443038: g5/379.746835443038,\n"
  "379.746835443038: b4~379.746835443038 + f4^379.746835443038 + a5/379.746835443038,\n"
  "379.746835443038: c5~379.746835443038,\n"
  "379.746835443038: d5~379.746835443038 + e4^379.746835443038,\n"
  "379.746835443038: g5/379.746835443038,\n"
  "379.746835443038: b4~379.746835443038 + d4^379.746835443038 + b5/379.746835443038,\n"
  "379.746835443038: a4~379.746835443038 + g5/379.746835443038,\n"
  "379.746835443038: g4~379.746835443038 + c4^379.746835443038 + a5/379.746835443038,\n"
  "379.746835443038: g5/379.746835443038 + a4~379.746835443038 + d4^379.746835443038,\n"
  "379.746835443038: g4~379.746835443038,\n"
  "379.746835443038: g5/379.746835443038 + e4^379.746835443038,\n"
  "379.746835443038: a4~379.746835443038,\n"
  "379.746835443038: b5/379.746835443038 + f4^379.746835443038 + b4~379.746835443038,\n"
  "379.746835443038: g5/379.746835443038 + c5~379.746835443038,\n"
  "379.746835443038: a5/379.746835443038 + e4^379.746835443038 + d5~379.746835443038,\n"
  "379.746835443038,\n"
  "379.746835443038: d4^379.746835443038 + c5~379.746835443038,\n"
  "379.746835443038: g5/379.746835443038 + b4~379.746835443038,\n"
  "379.746835443038: c4^379.746835443038 + a4~379.746835443038,\n"
  "379.746835443038: b5/379.746835443038 + d4^379.746835443038,\n"
  "379.746835443038: g5/379.746835443038 + e4^379.746835443038 + a4~379.746835443038,\n"
  "379.746835443038: a5/379.746835443038 + f4^379.746835443038 + b4~379.746835443038",

  "166.66666666666666,\n"
  "166.66666666666666: c5-166.66666666666666,\n"
  "166.66666666666666: b4-166.66666666666666,\n"
  "4833.333333333333",

  "500,\n"
  "500: c5~500,\n"
  "500: d5~500,\n"
  "500: e5~500,\n"
  "14000",

  "166.66666666666666,\n"
  "166.66666666666666: c5~166.66666666666666,\n"
  "166.66666666666666: d5~166.66666666666666,\n"
  "166.66666666666666: e5~166.66666666666666,\n"
  "166.66666666666666: b4~166.66666666666666,\n"
  "166.66666666666666: c5~166.66666666666666,\n"
  "166.66666666666666: d5~166.66666666666666,\n"
  "166.66666666666666: e5~166.66666666666666,\n"
  "166.66666666666666: d5~166.66666666666666,\n"
  "166.66666666666666: c5~166.66666666666666,\n"
  "166.66666666666666,\n"
  "166.66666666666666: b4~166.66666666666666,\n"
  "166.66666666666666: e5~166.66666666666666,\n"
  "166.66666666666666: c5~166.66666666666666,\n"
  "3000",

  "166.66666666666666\n"
};

int main(void) {
  NoteReadState nrs = {0};

  for (int i = 0; i < ARR_LEN(examples); i++) {
    printf("--- EXAMPLE %d ---\n", i);

    memset(&nrs, 0, sizeof(nrs));
    char *song = examples[i];
    do {
      if (nrs.ret.kind == NrsRetKind_Sound)
        printf("sound { freq: %d, shape: %d, duration: %f }\n",
          nrs.ret.sound.freq, nrs.ret.sound.sound, nrs.ret.duration);
      if (nrs.ret.kind == NrsRetKind_Pause)
        printf("pause { duration: %fms }\n", nrs.ret.duration);

      printf("%ld chars left\n", strlen(examples[i]) - nrs.i);
    } while (tune_parse(&nrs, song));
  }

  return 0;
}
